package com.bjtu.ptsite.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.bjtu.ptsite.tracker.entity.TrackerMessage;
import com.fasterxml.jackson.databind.ser.Serializers;
import org.apache.ibatis.annotations.*;

import javax.annotation.sql.DataSourceDefinition;
import java.util.List;

/**
 *
 * @author Zehao Wang, Junjie Zhang, Yutao Wei
 *
 */
@Mapper
public interface TrackerMessageMapper {

        String TABLE_NAME = "torrent_info";
        String INSERT_FIELDS = "( title,description,info_hash,file_size,file_count,torrent_path,category,is_anonymous,is_freeleech,uploader_id,message_id,file_name )";
        String INSERT_FIELDS2 = "(id,title,description,info_hash,file_size,file_count,torrent_path,category," +
                "is_anonymous,is_freeleech,uploader_id,message_id,file_name, download_discount)";
        String INSERT_FIELDS3 = "(id,title,description,info_hash,file_size,file_count,torrent_path,category," +
                "is_anonymous,is_freeleech,uploader_id,message_id,file_name, upload_time, download_discount)";

        /**
         * 插入一条TrackerMessage记录（不包含id，由数据库自动生成）。
         * 
         * @param trackerMessage 要插入的TrackerMessage对象
         */
        @Insert("INSERT INTO " +
                        TABLE_NAME +
                        INSERT_FIELDS +
                        " VALUES ( #{title},#{description},#{infoHash},#{fileSize},#{fileCount},#{torrentPath},#{category},#{isAnonymous},#{isFreeleech},#{uploaderId},#{messageId} ,#{fileName})")
        void insert(TrackerMessage trackerMessage);

        /**
         * 根据id查询TrackerMessage记录。
         * 
         * @param id 要查询的记录的id
         * @return 匹配的TrackerMessage对象，如果不存在则返回null
         */
        @Select("SELECT * FROM " + TABLE_NAME + " WHERE id = #{id}")
        TrackerMessage selectById(Integer id);

        /**
         * 查询所有的TrackerMessage记录。
         * 
         * @return 包含所有TrackerMessage记录的列表
         */
        @Select(" SELECT * FROM "
                        + TABLE_NAME + " ")
        List<TrackerMessage> selectAllTorrents();

        /**
         * 分页查询TrackerMessage记录。
         * 
         * @param offset 偏移量，用于指定分页的起始位置
         * @param size   每页的记录数
         * @param categoryId 分类id，用于指定查询的记录所属的分类
         * @return 指定页的TrackerMessage记录列表
         */
        @Select("<script>" +
                "SELECT * FROM " + TABLE_NAME +
                " <where>" +
                "   <if test='categoryId != null'>" +
                "       category = #{categoryId}" +
                "   </if>" +
                " </where>" +
                " LIMIT #{size} OFFSET #{offset}" +
                "</script>")
        List<TrackerMessage> selectTorrentsByPage(@Param("offset") int offset,
                        @Param("size") int size, @Param("categoryId") Integer categoryId);

        /**
         * 查询表中所有TrackerMessage记录的总数。
         *
         * @param categoryId 分类id，用于指定查询的记录所属的分类
         * @return 表中的记录总数
         */
        @Select("<script>" +
                "SELECT COUNT(*) FROM " + TABLE_NAME +
                " <where>" +
                "   <if test='categoryId != null'>" +
                "       category = #{categoryId}" +
                "   </if>" +
                " </where>" +
                "</script>")
        int selectTotalCount(@Param("categoryId") Integer categoryId);

        /**
         * 分页查询指定上传者的TrackerMessage记录。
         * 
         * @param uploaderId 上传者的id
         * @param offset     偏移量，用于指定分页的起始位置
         * @param size       每页的记录数
         * @param categoryId 分类id，用于指定查询的记录所属的分类
         * @return 指定页的指定上传者的TrackerMessage记录列表
         */
        @Select("<script>" +
                "SELECT * FROM " + TABLE_NAME +
                " WHERE uploader_id = #{uploaderId}" +
                " <if test='categoryId != null'>" +
                "   AND category = #{categoryId}" +
                " </if>" +
                " LIMIT #{size} OFFSET #{offset}" +
                "</script>")
        List<TrackerMessage> selectTorrentsByUploaderWithPage(@Param("uploaderId") int uploaderId,
                        @Param("offset") int offset,
                        @Param("size") int size, @Param("categoryId") Integer categoryId);

        /**
         * 查询指定上传者的TrackerMessage记录总数。
         * 
         * @param uploaderId 上传者的id
         * @param categoryId 分类id，用于指定查询的记录所属的分类
         * @return 指定上传者的记录总数
         */
        @Select("<script>" +
                "SELECT COUNT(*) FROM " + TABLE_NAME +
                " WHERE uploader_id = #{uploaderId}" +
                " <if test='categoryId != null'>" +
                "   AND category = #{categoryId}" +
                " </if>" +
                "</script>")
        int selectCountByUploader(@Param("uploaderId") int uploaderId, @Param("categoryId") Integer categoryId);

        /**
         * 分页查询指定上传者的非匿名TrackerMessage记录。
         * 
         * @param uploaderId 上传者的id
         * @param offset     偏移量，用于指定分页的起始位置
         * @param size       每页的记录数
         * @param categoryId 分类id，用于指定查询的记录所属的分类
         * @return 指定页的指定上传者的非匿名TrackerMessage记录列表
         */
        @Select("<script>" +
                "SELECT * FROM " + TABLE_NAME +
                " WHERE uploader_id = #{uploaderId} AND is_anonymous = 0" +
                " <if test='categoryId != null'>" +
                "   AND category = #{categoryId}" +
                " </if>" +
                " LIMIT #{size} OFFSET #{offset}" +
                "</script>")
        List<TrackerMessage> selectTorrentsByUploaderWithPageWithoutAnonymous(@Param("uploaderId") int uploaderId,
                        @Param("offset") int offset,
                        @Param("size") int size, @Param("categoryId") Integer categoryId);

        /**
         * 查询指定上传者的非匿名TrackerMessage记录总数。
         * 
         * @param uploaderId 上传者的id
         * @param categoryId 分类id，用于指定查询的记录所属的分类
         * @return 指定上传者的非匿名记录总数
         */
        @Select("<script>" +
                "SELECT COUNT(*) FROM " + TABLE_NAME +
                " WHERE uploader_id = #{uploaderId} AND is_anonymous = 0" +
                " <if test='categoryId != null'>" +
                "   AND category = #{categoryId}" +
                " </if>" +
                "</script>")
        int selectCountByUploaderWithoutAnonymous(@Param("uploaderId") int uploaderId, @Param("categoryId") Integer categoryId);

        /**
         * 根据info_hash查询单个TrackerMessage记录。
         * 
         * @param hexInfoHash 要查询的info_hash值
         * @return 匹配的TrackerMessage对象，如果不存在则返回null
         */
        @Select(" SELECT * FROM "
                        + TABLE_NAME + " WHERE info_hash = #{hexInfoHash}")
        TrackerMessage selectByInfoHash(String hexInfoHash);

        /**
         * 根据id更新TrackerMessage记录的部分字段。
         * 
         * @param trackerMessage 包含要更新字段的TrackerMessage对象，必须包含id
         */
        @Update("UPDATE " + TABLE_NAME + " SET is_freeleech = #{isFreeleech}, promotion_status = #{promotionStatus}," +
                        "upload_multiplier = #{uploadMultiplier}, download_discount = #{downloadDiscount} WHERE id=#{id}")
        void updateById(TrackerMessage trackerMessage);

        /**
         * 根据id删除TrackerMessage记录。如果id为null，则不执行删除操作。
         * 
         * @param id 要删除的记录的id
         */
        @Delete("DELETE FROM " + TABLE_NAME + " WHERE #{id} IS NULL OR id = #{id}")
        void delete(Integer id);

        /**
         * 插入一条TrackerMessage记录（包含id，由用户指定）。
         * 
         * @param trackerMessage 要插入的TrackerMessage对象，必须包含id
         */
        @Insert("INSERT INTO " +
                        TABLE_NAME +
                        INSERT_FIELDS2 +
                        " VALUES (#{id},#{title},#{description},#{infoHash},#{fileSize},#{fileCount},#{torrentPath}," +
                "#{category},#{isAnonymous},#{isFreeleech},#{uploaderId},#{messageId} ,#{fileName}," +
                "#{downloadDiscount})")
        void insert2(TrackerMessage trackerMessage);

        /**
         * 根据info_hash查询TrackerMessage记录列表（可能有多个）。
         * 
         * @param hexInfoHash 要查询的info_hash值
         * @return 匹配的TrackerMessage记录列表，如果不存在则返回空列表
         */
        @Select(" SELECT * FROM "
                        + TABLE_NAME + " WHERE info_hash = #{hexInfoHash}")
        List<TrackerMessage> selectByInfoHash2(String hexInfoHash);

        /**
         * 插入一条TrackerMessage记录（包含id，由用户指定）。
         *
         * @param trackerMessage 要插入的TrackerMessage对象，必须包含id
         */
        @Insert("INSERT INTO " +
                TABLE_NAME +
                INSERT_FIELDS3 +
                " VALUES (#{id},#{title},#{description},#{infoHash},#{fileSize},#{fileCount},#{torrentPath}," +
                "#{category},#{isAnonymous},#{isFreeleech},#{uploaderId},#{messageId} ,#{fileName}," +
                "#{uploadTime}, #{downloadDiscount})")
        void insert3(TrackerMessage trackerMessage);

        /**
         * 根据id查询TrackerMessage记录。
         *
         * @param id 要查询的记录的id
         * @return 匹配的TrackerMessage对象，如果不存在则返回null
         */
        @Select("SELECT * FROM " + TABLE_NAME + " WHERE id = #{id}")
        List<TrackerMessage> selectAllById(Integer id);

        /**
         * 更新指定id的TrackerMessage记录的is_connect字段。
         *
         * @param trackerMessage 包含要更新的is_connect字段和id的TrackerMessage对象
         */
        @Update("UPDATE " + TABLE_NAME + " SET is_connect = #{isConnect} WHERE id = #{id}")
        void updateConnectStatus(TrackerMessage trackerMessage);
}// This is a comment
